/***************************************************************************
 *   Copyright (C) 2005 by xihe   *
 *   xihels@163.com                                                        *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#ifndef _CLUSTER_OPERATE_REPLY_H_
#define _CLUSTER_OPERATE_REPLY_H_
#include "Packet.h"


/**
 * 群命令的回复包，根据不同的子命令类型格式有所不同：
 * 创建群的回复包，格式为：
 * 1. 头部
 * 2. 命令类型，1字节，创建群是0x1
 * 3. 回复码，1字节，成功是0x0，如果成功则后面为
 *    1. 群内部ID，4字节，如果为0，表示创建失败
 *    2. 群外部ID，4字节，如果为0，表示创建失败
 * 4. 如果回复码不为0，则后面为出错信息
 * 5. 尾部
 * 
 * 创建临时群的回复包
 * 1. 头部
 * 2. 命令类型，1字节，0x30
 * 3. 回复码，1字节
 * 4. 临时群类型，1字节，0x01是多人对话，0x02是讨论组
 * 5. 父群内部ID，4字节
 * 6. 创建的临时群的内部ID，4字节
 * 7. 尾部
 * 
 * 激活群的回复包，格式为：
 * 1. 头部
 * 2. 命令类型，激活是0x5
 * 3. 回复码，1字节，成功是0x0
 * 4. 群的内部ID
 * 5. 尾部
 * 
 * 得到群信息的回复包，格式为：
 * 1. 头部
 * 2. 命令类型，1字节，得到群信息是0x4
 * 3. 回复码，1字节，成功是0x0
 * 4. 群内部ID，4字节
 * 5. 群外部ID，4字节
 * 6. 群类型，1字节
 * 7. 创建者QQ号，4字节
 * 8. 认证类型，1字节
 * 9. 未知的2字节，全0
 * 10. 群分类，2字节
 * 11. 未知的两字节，全0
 * 12. 未知的两字节，全0
 * 13. 群名称长度，1字节
 * 14. 群名称
 * 15. 未知的两字节，全0
 * 15. 群声明长度，1字节
 * 16. 群声明
 * 17. 群描述长度，1字节
 * 18. 群描述
 * 19. 群中成员的QQ号，4字节
 * 20. 分隔符，1字节，0x00
 * 21. 如果存在更多成员，重复19, 20部分
 * 22. 尾部
 * 
 * 得到临时群信息的回复包，格式为
 * 1. 头部
 * 2. 命令类型，1字节，0x33
 * 3. 回复码，1字节，成功是0x00
 * 4. 群类型，1字节
 * 5. 父群内部ID，4字节
 * 6. 临时群内部ID，4字节
 * 7. 创建者QQ号，4字节
 * 8. 未知的4字节，全0
 * 9. 群名称长度，1字节
 * 10. 群名称
 * 11. 群中成员的QQ号，4字节
 * 12. 分隔符，1字节，0x00
 * 13. 如果有更多成员，重复11-12部分
 * 14. 尾部
 * 
 * 退出群的回复，格式为：
 * 1. 头部
 * 2. 命令类型，1字节，退出是0x9
 * 3. 回复码，1字节，成功是0x0
* 4. 群内部ID，4字节，应该是个非0值
* 5. 尾部
* 
* 请求成员信息的回复包，格式为
* 1. 头部
* 2. 命令类型，1字节，请求成员信息是0x0C
* 3. 回复码，1字节，成功是0x0
* 4. 群内部ID，4字节
* 5. 成员QQ号，4字节
* 6. 头像号，2字节
* 7. 年龄，1字节
* 8. 性别，1字节
* 9. 昵称长度，1字节
* 10. 昵称
* 11. 未知的2字节
* 12. 扩展标志，1字节
* 13. 通用标志，1字节
* 14. 如果有更多成员，重复5-14部分，5－14部分其实也就是QQFriend结构
* 15. 尾部
* 
* 得到在线成员的回复包，格式为：
* 1. 头部
* 2. 命令类型，1字节，请求成员信息是0x0B
* 3. 回复码，1字节，成功是0x0
* 4. 群内部ID，4字节
* 5. 未知字节，0x3C
* 6. 在线成员的qq号
* 7. 如果有更多在线成员，重复5
* 8. 尾部
* 
* 得到临时群成员列表的回复包
* 1. 头部
* 2. 命令类型，1字节，0x37
* 3. 回复码，1字节
* 4. 临时群类型，1字节
* 5. 父群内部ID，4字节
* 6. 临时群内部ID，4字节
* 7. 成员QQ号，4字节
* 8. 如果有更多成员，重复7部分
* 9. 尾部
* 
* 请求加入群的回复包，格式为：
* 1. 头部
* 2. 命令类型，1字节，请求成员信息是0x07
* 3. 回复码，1字节，成功是0x0
* 4. 群内部ID，4字节
* 5. 回复码，这个回复码是比较细的特定于join请求的回复，1字节
* 6. 尾部
* 
* 请求加入群的认证信息回复包，没什么太大用处，就是表示服务器收到了，格式为：
* 1. 头部
* 2. 命令类型，这里是0x8
* 3. 回复码，1字节，成功是0x0
* 4. 群内部ID，4字节，如果为0表示出错
* 5. 尾部
* 
* 修改群信息的回复包，格式为：
* 1. 头部
* 2. 命令类型，这里是0x03
* 3. 回复码，1字节，成功是0x0
* 4. 群内部ID，4字节
* 5. 尾部
* 
* 修改群成员的回复包，格式为：
* 1. 头部
* 2. 命令类型，这里是0x03
* 3. 回复码，1字节，成功是0x0
* 4. 群内部ID，4字节
* 5. 尾部
* 
* 搜索群的回复包，格式为：
* 1. 头部
* 2. 命令类型，这里是0x06
* 3. 回复码，1字节，成功是0x0
* 4. 搜索方式，1字节
* 5. 群内部ID，4字节
* 6. 群外部ID，4字节
* 7. 群类型，1字节
* 8. 群创建者，4字节
* 9. 未知的2字节
* 10. 群分类，2字节
* 11. 群名称长度，1字节
* 12. 群名称
* 13. 未知的两字节
* 14. 认证类型，1字节
* 15. 群简介长度，1字节
* 16. 群简介
* 17. 尾部
* 
* 发送群信息和发送扩展群信息的回复包
* 1. 头部
* 2. 命令类型，1字节，0x0A
* 3. 回复码，1字节
* 4. 群内部id，4字节
* 5. 尾部
* 
* 发送临时群信息的回复包
* 1. 头部
* 2. 命令类型，1字节，0x35
* 3. 回复码，1字节
* 4. 临时群类型，1字节
* 5. 父群内部ID，4字节
* 6. 临时群内部ID，4字节
* 7. 尾部
* 
* 退出临时群的回复包
* 1. 头部
* 2. 命令类型，1字节，0x32
* 3. 回复码，1字节
* 4. 临时群类型，1字节
* 5. 父群内部ID，4字节
* 6. 临时群内部ID，4字节
* 7. 尾部
* 
* 修改临时群成员的回复包
* 1. 头部
* 2. 命令类型，这里是0x31
* 3. 回复码，1字节，成功是0x00
* 4. 临时群类型，1字节
* 5. 父群内部ID，4字节
* 6. 临时群内部ID，4字节
* 7. 操作方式，1字节，0x01是添加，0x02是删除
* 8. 操作的成员QQ号，4字节
* 9. 如果有更多成员，重复8部分
* 10. 尾部
*/

class ClusterOperateReply : public InPacket {
    protected:
	ClusterOperateReply(const uint8_t* buf,
		int len,
		bool _retell = false):
	    InPacket(buf, len, _retell),
	    subCommand(*(buf + QQ_HEADER_LENGTH_BASIC_FAMILY_IN)),
	    replyCode(*(buf + QQ_HEADER_LENGTH_BASIC_FAMILY_IN + 1))
	{};
    public:
	static InPacket* create(const uint8_t* buf, int len);


	uint8_t getSubCommand() const { return subCommand; }
	bool	isSucceed() const { return 0x00 == replyCode; }

	// 创建一个群操作的回复包
	static uint8_t getSubCommand(const uint8_t* buf) 
	{
	    return *(buf + QQ_HEADER_LENGTH_BASIC_FAMILY_IN);
	}

    private:
	uint8_t subCommand;
	uint8_t replyCode;
};

#endif // _CLUSTER_OPERATE_REPLY_H_

